Skip to content

Develop#157

Merged
bedatty merged 53 commits intomainfrom
develop
Mar 20, 2026
Merged

Develop#157
bedatty merged 53 commits intomainfrom
develop

Conversation

@bedatty
Copy link
Contributor

@bedatty bedatty commented Mar 20, 2026

Lerian

GitHub Actions Shared Workflows


Description

Type of Change

  • feat: New workflow or new input/output/step in an existing workflow
  • fix: Bug fix in a workflow (incorrect behavior, broken step, wrong condition)
  • perf: Performance improvement (e.g. caching, parallelism, reduced steps)
  • refactor: Internal restructuring with no behavior change
  • docs: Documentation only (README, docs/, inline comments)
  • ci: Changes to self-CI (workflows under .github/workflows/ that run on this repo)
  • chore: Dependency bumps, config updates, maintenance
  • test: Adding or updating tests
  • BREAKING CHANGE: Callers must update their configuration after this PR

Breaking Changes

None.

Testing

  • YAML syntax validated locally
  • Triggered a real workflow run on a caller repository using @develop or the beta tag
  • Verified all existing inputs still work with default values
  • Confirmed no secrets or tokens are printed in logs
  • Checked that unrelated workflows are not affected

Caller repo / workflow run:

Related Issues

Closes #

Summary by CodeRabbit

  • New Features

    • Added security scanning actions: Trivy filesystem/image scans, Dockerfile compliance checks, and Docker Hub Health Score validation.
    • Added comprehensive linting suite: YAML, Actions, shell, Markdown, typos, and composite schema validators.
    • Added new reusable workflows for Go fuzz testing, release notifications (Discord/Slack), and TypeScript Docker builds.
    • Added notification actions for Discord and Slack release announcements.
  • Documentation

    • Extensive updates to GitHub Actions conventions, composite action guidelines, and reusable workflow patterns.
    • New documentation for all linting, security scanning, and notification actions.
    • Added examples for monorepo path filtering, platform selection, and configurability patterns.
  • Configuration

    • Updated default runner to blacksmith-4vcpu-ubuntu-2404 across workflows.
    • Added self-hosted runner configuration and Dependabot grouping for linting tools.
    • Added Markdown link check configuration and new GitHub labels.
  • Chores

    • Bumped GitHub Actions versions (setup-node, upload-artifact, checkout, Docker actions).

bedatty and others added 30 commits March 6, 2026 15:59
Bumps the utilities group with 1 update: [actions/github-script](https://github.com/actions/github-script).


Updates `actions/github-script` from 7 to 8
- [Release notes](https://github.com/actions/github-script/releases)
- [Commits](actions/github-script@v7...v8)

---
updated-dependencies:
- dependency-name: actions/github-script
  dependency-version: '8'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: utilities
...

Signed-off-by: dependabot[bot] <support@github.com>
feat(build): add typescript docker build workflow and composite
fix(build): use per-app build context with fallback to global input
Replace ubuntu-latest with blacksmith-4vcpu-ubuntu-2404 across
remaining workflows and add runner requirement to command rules.
…h-runner

chore(ci): standardize runner to blacksmith-4vcpu-ubuntu-2404
Add reusable workflow for Go fuzz testing with configurable command,
Go version, artifact upload on failure, and dry_run support.
feat(ci): add go-fuzz reusable workflow
- Prefer github.event.release.tag_name with fallback to gh release list
- Map secrets to job-level env vars (secrets context unavailable in step if:)
- Detect beta via release-tag input instead of github.ref
- Complete dry-run summary with all resolved inputs
…kflow

Composite actions referenced via `uses: ./path` in reusable workflows
resolve to the caller's workspace, not the called repo. Changed to
external refs (@develop) matching the typescript-build.yml pattern.

Also corrected the local path rule in AGENTS.md and
.cursor/rules/reusable-workflows.mdc to document the correct behavior.
…orkflow

feat(ci): add release-notification reusable workflow
dependabot bot and others added 16 commits March 11, 2026 17:32
…evelop/github-security-1893dd32ff

chore(deps): bump github/codeql-action from 3 to 4 in the github-security group
…evelop/docker-1590fac0fc

chore(deps): bump the docker group with 5 updates
Bumps the actions-core group with 5 updates:

| Package | From | To |
| --- | --- | --- |
| [actions/checkout](https://github.com/actions/checkout) | `4` | `6` |
| [actions/setup-node](https://github.com/actions/setup-node) | `4` | `6` |
| [actions/upload-artifact](https://github.com/actions/upload-artifact) | `4` | `7` |
| [actions/download-artifact](https://github.com/actions/download-artifact) | `4` | `8` |
| [actions/setup-go](https://github.com/actions/setup-go) | `5` | `6` |


Updates `actions/checkout` from 4 to 6
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@v4...v6)

Updates `actions/setup-node` from 4 to 6
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](actions/setup-node@v4...v6)

Updates `actions/upload-artifact` from 4 to 7
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](actions/upload-artifact@v4...v7)

Updates `actions/download-artifact` from 4 to 8
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](actions/download-artifact@v4...v8)

Updates `actions/setup-go` from 5 to 6
- [Release notes](https://github.com/actions/setup-go/releases)
- [Commits](actions/setup-go@v5...v6)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions-core
- dependency-name: actions/setup-node
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions-core
- dependency-name: actions/upload-artifact
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions-core
- dependency-name: actions/download-artifact
  dependency-version: '8'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions-core
- dependency-name: actions/setup-go
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions-core
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…ons (#135)

* fix(ci): use path segment boundary matching to prevent prefix collisions

* fix(ci): strip trailing slash from filter paths before matching

* fix(ci): strip all trailing slashes from filter paths
…site (#137)

* refactor(ci): migrate basic workflows to internal changed-paths composite

Replace external github-actions-changed-paths@main with the internal
composite action (src/config/changed-paths) in gptchangelog,
pr-security-scan, and typescript-release workflows.

* refactor(ci): migrate build workflows and support newline filter_paths

Migrate build and typescript-build to the internal changed-paths
composite. Update composite to accept both JSON array and
newline-separated formats for filter_paths input, ensuring
backward compatibility with all callers.

* fix(changed-paths): fail on malformed JSON filter_paths instead of silent fallback

Detect if filter_paths starts with '[' and validate strictly with jq -er.
Malformed JSON now fails with a clear error instead of silently producing
an empty matrix. Also fix stale comment in build.yml.
* feat(ci): add force_multiplatform input to build workflow

* fix: gate QEMU setup on arm64 platform presence instead of is_release
…atibility (#138)

- actions/checkout v4 → v6 (labels-sync composite)
- docker/setup-qemu-action v3 → v4
- docker/setup-buildx-action v3 → v4
- docker/login-action v3 → v4
- docker/metadata-action v5 → v6
- docker/build-push-action v6 → v7
- gaurav-nelson/github-action-markdown-link-check → tcort/markdown-link-check-action (deprecated)
…alysis (#139)

* feat(ci): add integration tests and test determinism jobs to go-pr-analysis

Add optional jobs for integration testing and test determinism
verification, enabling callers to consolidate CI workflows.

New inputs:
- enable_integration_tests (boolean, default false)
- integration_test_command (string, default 'make test-integration')
- enable_test_determinism (boolean, default false)
- test_determinism_runs (number, default 3)

* fix(ci): align test-determinism with tests job package exclusions

Detect Makefile test target and exclude /tests/ and /api/ packages
to match the same suite executed by the tests job.

* fix(deps): correct tcort markdown-link-check action name

* Revert "fix(deps): correct tcort markdown-link-check action name"

This reverts commit 6d22810.

* fix(ci): always use go test with shuffle flags for determinism job

Remove Makefile detection from test-determinism job. The tests job
already validates that tests pass via Makefile; this job must always
use go test with -count=1 -shuffle=on to actually verify determinism.

* docs(ci): document integration tests and test determinism inputs
…-security-scan workflow (#142)

* feat(security): add Docker Scout scan composite and integrate into pr-security-scan workflow

* feat(security): add pr-security-reporter composite for PR comment orchestration
…supply chain attestations (#144)

* fix(security): remove code fences from Scout HTML outputs in pr-security-reporter

* fix(ci): point composite refs to fix branch for testing

* fix(security): add divider between Trivy and Docker Scout sections in PR comment

* fix(security): add section headers and divider for Trivy and Docker Scout in PR comment

* fix(security): disable auto PR comment on Scout recommendations to avoid duplicates

* feat(security): add Scout compare with environments and environment recording in build workflow

* feat(security): fallback docker_scout_compare_env to github.base_ref when not provided

* docs(security): fix docker_scout_compare_env input description to reflect fallback behavior

* fix(config): suppress broken pipe error in changed-paths tag comparison

* fix(ci): temporarily point changed-paths ref to fix branch for broken pipe fix

* fix(security): pass organization to all Scout steps and graceful compare fallback

Pass organization input to quickview, cves, and recommendations steps
to fix "no organization configured" warning. Add continue-on-error to
compare step so missing environment baselines don't fail the workflow.

* fix(ci): use metadata-action version for Scout environment image tag

The version step outputs v1.5.0-beta.6 (with v prefix) but
docker/metadata-action strips it to 1.5.0-beta.6. Scout environment
was using the wrong tag, causing MANIFEST_UNKNOWN on pull.

* feat(security): add app_name_prefix and app_name_overrides inputs to pr-security-scan

Aligns component names between build and security scan workflows so
Docker Scout compare can find the correct image in the environment.

* fix(security): hide Scout recommendations when no actionable findings

Skip rendering the recommendations section when Scout reports
"image version is up to date" and "no tag recommendations",
avoiding empty/unhelpful output in PR comments.

* fix(security): show positive message when no Scout recommendations found

* fix(security): show positive message when no CVEs found by Scout

* feat(security): improve Scout PR comment with policy grades and visual cues

- Rename Quickview to Overview & Policies with derived letter grade (A-F)
  from policy pass ratio so devs know at a glance if they need to expand
- Add alert emoji on CVE Details when vulnerabilities are found
- Add lightbulb emoji on recommendations when actionable suggestions exist
- Scout CVEs now set hasFindings=true to fail the security gate

* fix(security): replace derived grade with policy pass/fail status

Custom A-F grade didn't match Docker Hub's actual scoring. Show
policy count and PASSED/FAILED status instead.

* fix(security): reorder Scout sections — compare after overview

* fix(security): remove redundant Scout success message

* fix(security): remove redundant final success message from PR comment

* refactor(security): restructure pr-security-reporter into functions

Extract Trivy FS scan, Docker image scan, and Scout analysis into
separate functions for readability. Add shared helpers for severity
sorting, markdown escaping, truncation, and details blocks.

* style(security): improve PR comment visual hierarchy

- Main title promoted to h1 with separator
- Section headers (Trivy, Docker Scout) as h2
- Sub-sections (Filesystem Scan, Docker Image Scan, CVE Details,
  Recommendations) promoted to h3
- Added dividers between major sections

* Revert "style(security): improve PR comment visual hierarchy"

This reverts commit b396a66.

* feat(security): add docker_scout_fail_on_policy option to break on policy failures

New opt-in input (default false) that fails the security gate when
Docker Scout policies are not fully met (e.g., non-root user, missing
attestations). Callers can enable it when ready to enforce policies.

* feat(security): default docker_scout_fail_on_policy to true

When Docker Scout is enabled, enforce policy compliance by default.
Callers can opt out with docker_scout_fail_on_policy: false.

* fix(security): pass Scout outputs via files instead of env vars

Env vars truncate multiline HTML content from Docker Scout outputs.
Write outputs to files in a .scout-outputs directory and read them
in the reporter, fixing empty quickview/cves/recommendations.

* fix(security): propagate reporter outputs via shell step

core.setOutput in actions/github-script inside composite actions
does not propagate to the composite outputs. Use the script return
value (result) and parse it in a shell step that writes directly
to GITHUB_OUTPUT.

* fix(security): fix double-encoded JSON output and unreachable PR comment code

The github-script default result-encoding (json) was double-encoding
the returned JSON string, causing jq parse failure (exit code 5).
Added result-encoding: string to fix. Also moved the return statement
after the Post Comment block which was unreachable.

* fix(security): use hyphenated output names from reporter composite

The composite outputs are defined as has-findings/has-errors (hyphens)
but the gate step was referencing has_findings/has_errors (underscores),
resulting in empty values and the gate never failing.

* fix(security): default docker_scout_fail_on_policy to false

Disable policy failure gate by default so Scout findings are
informational unless callers explicitly opt in.

* feat(build): enable SBOM and provenance attestations on Docker builds

Adds sbom: true and provenance: mode=max to docker/build-push-action
to satisfy Docker Scout supply chain attestation policies.

* feat(build): auto-enable Docker Scout for repo before environment recording

Runs docker scout repo enable before recording the image in a Scout
environment. The command is idempotent and the || true ensures it
doesn't fail the build if the repo is already enabled.

* fix(gitops): fix invalid GITHUB_OUTPUT format when no files updated

When UPDATED_FILES was empty, grep -c returned 0 with exit code 1,
triggering || echo 0 which appended a second 0 to the output line,
producing an invalid format for GITHUB_OUTPUT.

* fix(security): add continue-on-error to all Docker Scout steps

Scout quickview fails with "image has no base image" on locally built
images without provenance. All Scout steps should be non-blocking since
the reporter handles missing outputs gracefully.

* fix(security): show fallback message when Scout quickview is unavailable

When the quickview step fails (e.g. base image not detected on local
builds), display an informational message instead of silently omitting
the Overview & Policies section.

* fix(security): add if: always() to all Docker Scout composite steps

When quickview fails (e.g. base image not detected), subsequent steps
(cves, recommendations, compare) were skipped because composite actions
stop on failure by default. Adding if: always() ensures all steps run
independently.

* fix(security): only show quickview fallback when compare is also unavailable

When quickview fails but compare is active, policies are already shown
in the compare section. The fallback warning is now only displayed when
neither quickview nor compare have data.

* fix(security): use generic fallback message for unavailable policy evaluation

* feat(security): show policy status in compare section header

When quickview is unavailable and compare is active, parse the compare
output for policy status icons and display a summary (e.g. 5/7 policies
met) in the collapsible header. Also enforce fail-on-policy from compare
data when quickview is missing.

* refactor(security): remove quickview in favor of compare for policy evaluation

Quickview requires provenance attestations to detect the base image,
which is not possible with load: true (local builds). The compare
command already provides policy evaluation via the Scout backend.

- Remove quickview step from docker-scout composite
- Remove quickview output and file saving
- Simplify reporter to use compare for policy status
- Show informational message when no environment is configured

* fix(security): parse policy count from PR column only in compare output

The compare table has policy status for both environment and PR images.
Counting all icons doubled the total. Now parses each row and reads
only the PR column (second status) for accurate policy counts.

* revert(build): remove explicit sbom and provenance attestations

Docker Scout cannot read attestations from image indexes, making
explicit sbom: true and provenance: mode=max ineffective. BuildKit
default (provenance: mode=min) is kept implicitly.

* feat(build): use Scout SBOM indexer for attestations

Use docker/scout-sbom-indexer as the SBOM generator instead of the
default BuildKit generator. This produces attestations in the format
that Docker Scout expects for policy evaluation.

* fix(build): install Scout CLI before repo enable command

The docker scout CLI plugin is not available on the runner by default.
Install it before running docker scout repo enable.

* fix(build): install Scout CLI as Docker plugin instead of standalone binary

The install script without -b flag installs to ~/.docker/cli-plugins/
by default, which is required for docker scout subcommand to work.

* fix(security): fix policy row parsing in compare output

The compare table format is |Name|env_status|pr_status|Change|Standing|.
The regex was matching from the first column expecting a status icon,
but the first column is the policy name. Fixed to match rows with
status icons in the second and third columns, and read PR status
from column index 3.

* feat(security): show policy summary table outside collapsible

Extract policy status from compare output and display as a visible
table with pass/fail count header. The full compare details remain
in a collapsible section below.

* feat(security): render clean policy status text in summary table

Replace raw markdown icons (:white_check_mark:, :warning:, :question:)
with readable text (Passed, Failed, No data) in the policy summary.

* feat(security): add environment tag and PR image columns to policy table

Show both the remote environment version and the local PR image status
side by side in the policy summary table for better comparison.

* fix(security): remove redundant status column from policy table

* fix(security): omit policies that can't be evaluated on local builds

Skip supply chain attestations, outdated base images, and unapproved
base images from the policy summary since they require provenance
data not available on locally built images.

* fix(security): always show recommendations section even when empty

The recommendations step can fail silently (base image not detected),
leaving the output empty. Show the positive message as fallback.

* refactor(security): remove recommendations from PR scan

Recommendations depends on base image detection which fails on locally
built images (load: true). Remove the step, input, output, and reporter
section to reduce noise. Recommendations will be available via the
Scout dashboard for pushed images.

* refactor(security): replace Docker Scout with internal health score checks

* refactor(build): remove Scout environment recording and switch SBOM generator to syft

* feat(security): add high-profile vulnerabilities check via CISA KEV catalog

* fix(build): revert SBOM generator to docker/scout-sbom-indexer

* feat(security): use org token for PR comments and add useful links

* fix(security): keep only scan logs link in PR comment

* chore(security): add emoji to scan link and bump trivy to v0.69.3

* fix(security): exclude USER root/0 from non-root user check and remove dead code

* refactor(security): extract trivy scans and checks into reusable composites

* fix(security): scope Trivy fs scanners explicitly and fix README output reference

* chore: update all composite refs from fix/scout-html-output to develop
…rison

fix(changed-paths): use channel-aware tag comparison for beta/rc/release
* feat(ci): add YAML and GitHub Actions lint analysis for PRs

Add self-pr-analysis workflow that runs yamllint and actionlint
on pull requests to validate YAML syntax and GitHub Actions
workflow correctness.

* fix(ci): scope yamllint and actionlint to changed files only

Filter both linters to only check files modified in the PR instead
of scanning the entire repository. Falls back to full scan on
workflow_dispatch.

* fix(ci): register blacksmith runner label for actionlint

Add actionlint config with blacksmith-4vcpu-ubuntu-2404 as a known
self-hosted runner label to avoid false-positive runner-label errors.

* feat(ci): add pinned actions check, markdown link check, typos, and self-pr-validation

- Pinned Actions Check: fails on uses: @main/@master (skips LerianStudio)
- Markdown Link Check: validates links in changed .md files
- Spelling Check: typos-cli across the codebase
- self-pr-validation: thin entrypoint calling pr-validation.yml
  with source branch enforcement for PRs to main
- Add .github/markdown-link-check-config.json
- Update dependabot groups for new actions

* refactor(ci): merge self-pr-analysis into self-pr-validation

Consolidate all PR checks into a single self-pr-validation workflow:
PR validation, YAML lint, actionlint, pinned actions, markdown link
check, and spelling. Remove self-pr-analysis.yml.

* feat(lint): add lint composites and refactor self-pr-validation

Create 5 composite actions under src/lint/:
- yamllint: YAML syntax validation
- actionlint: GitHub Actions workflow validation
- pinned-actions: ensures uses: refs are pinned
- markdown-link-check: validates links in .md files
- typos: spelling check via typos-cli

Refactor self-pr-validation to use composites directly with a
shared changed-files detection job for all lint checks.

* feat(config): extract changed-workflows composite from self-pr-validation

Create src/config/changed-workflows composite that categorizes
changed files by type (YAML, workflows, actions, markdown) for
downstream lint jobs. Refactor self-pr-validation to use it.

* fix(ci): add changed-files dependency to typos job

* fix(config): fix find operator precedence and require github-token in changed-workflows

- Fix find -name operator precedence bug: wrap -name flags in \( \)
  so both .yml and .yaml files are returned in workflow_dispatch fallback
- Make github-token required to prevent silent auth failures with gh CLI
- Fix yamllint glob pattern to recursively match .yml files

* feat(lint): add step summaries to all lint and detection composites

Each composite now writes a GitHub Step Summary before running,
listing the files it will process (or scope for typos). Feedback
is self-contained in each composite, not in the workflow.

* refactor(lint): replace step summaries with log output in lint composites

* refactor(lint): add file count and list to log step in lint composites

* refactor(lint): use group annotations and sed for file log in lint composites

* fix(changed-workflows): replace while loop with sed to fix step summary list rendering

* fix(lint): action-files csv, actionlint covers src/ composites, log changed-files to stdout

* feat(notify): add pr-lint-reporter composite and lint-report job to post PR comments

* refactor(notify): replace files collapse with failures collapse in pr-lint-reporter

* feat(lint): scope spelling check to changed files only, add all-files detection

* feat(notify): fetch job annotations to show per-file errors in failures collapse

* fix(lint): use env vars for input interpolation in run blocks, fix grep -Fq, gate typos on changed files

* fix(lint): scope actionlint to workflow files only to avoid composite false positives

* fix(notify): filter only failure-level annotations in lint reporter to exclude warnings

* chore(deps): upgrade actions/checkout to v6 in self-pr-validation

* feat(lint): enforce full semver pinning in pinned-actions check

* feat(lint): warn on internal unpinned actions instead of failing in pinned-actions check

* feat(lint): restrict external actions to final releases only, allow pre-releases for internal

* feat(lint): warn on internal pre-release tags (beta/rc) instead of allowing silently

* fix(lint): anchor uses: grep to start of line to avoid false matches in shell scripts

* fix(lint): align pinned-actions description and error message with actual validation rules

- gate lint-report on changed-files success to avoid misleading skipped summaries
- paginate annotation fetches in pr-lint-reporter (per_page 100)
- fix pinned-actions description and error message to reflect final-release-only rule for externals

* chore(lint): clean up markdown-link-check and yamllint configs

* ci(self): remove edited trigger to prevent reruns on CodeRabbit updates

* fix(lint): tighten markdown config, fix pinned-actions grep pattern, scope workflow permissions

* fix(lint): add pull-requests read to changed-files job, strip inline comments in pinned-actions

* feat(lint): add shellcheck and readme-check composites to PR lint pipeline

* fix(lint): quote shellcheck description, add pr-lint-reporter README

* fix(lint): quote step name containing run: in shellcheck composite

* fix(lint): remove GHA expression syntax from Python comment in shellcheck

* fix(lint): use shell variable placeholder for GHA expressions, exclude SC2154

* fix(lint): respect shell type and count all severity findings in shellcheck

* fix(lint): fix GHA regex for nested braces, correct shellcheck line offset

* feat(lint): add composite-schema lint to validate input conventions

* fix(lint): scope composite-schema to src/ action files only via dedicated output

* feat(lint): extend composite-schema with name, description, steps, kebab-case and reserved prefix checks

* feat(lint): validate composite directory depth matches src/<capability>/<name>/action.yml

* fix(lint): apply directory depth check only after confirming composite action

* fix(lint): gate validation job to PR events, harden composite-schema inputs, escape JS file paths with toJSON

* fix(lint): add actions:read permission, harden composite-schema type guards, fix README example

* fix(lint): fix inputs normalization false-negative and double-count, align README example guard

* fix(lint): treat YAML parse errors as violations, enforce action.yml filename in path check
… root-level file changes (#155)

* feat(changed-paths): add shared_paths input to trigger full matrix on root-level file changes

* fix(changed-paths): rename inputs to kebab-case to pass composite-schema lint

* fix(workflows): remove trailing spaces and quote GITHUB_OUTPUT redirects (SC2086)

* fix(workflows): quote GITHUB_OUTPUT redirects and suppress inapplicable shellcheck rules

* fix(workflows): quote GITHUB_OUTPUT, fix SC2188/SC2034/SC2193/SC2001 in remaining workflows

* docs(changed-paths): update README input names to kebab-case and add migration table

* fix(changed-paths): add jq error handling for malformed filter-paths JSON in shared path branch

* fix(gptchangelog): replace useless cat with input redirection (SC2002)

* fix(gptchangelog): rename unused APP_NAME/VERSION to _ in changelog PR while loop

* fix(changed-paths): align error message and README section to kebab-case naming

* docs(changed-paths): update remaining snake_case section headers and prose to kebab-case

* docs(changed-paths): move path-level disabled annotation from default cell to description

* feat(workflows): propagate shared_paths input to all reusable workflows using changed-paths

* fix(workflows): point changed-paths to feat branch for self-consistent testing

* fix(workflows): revert changed-paths ref back to develop pre-merge
@bedatty bedatty self-assigned this Mar 20, 2026
@bedatty bedatty requested a review from a team as a code owner March 20, 2026 17:50
@coderabbitai
Copy link

coderabbitai bot commented Mar 20, 2026

Caution

Review failed

Pull request was closed or merged during review

Walkthrough

This PR introduces comprehensive GitHub Actions infrastructure refactoring and hardening: new composites for linting/security scanning, updated workflow conventions enforcing blacksmith runner usage and three-layer configurability, removal of the legacy changed-paths workflow in favor of a shared composite, new release notification workflows, and extended documentation covering reserved names, step-section formatting, and conditional-feature exposure patterns.

Changes

Cohort / File(s) Summary
Documentation & Rules
.claude/commands/composite.md, .claude/commands/gha.md, .claude/commands/workflow.md, .cursor/rules/composite-actions.mdc, .cursor/rules/reusable-workflows.mdc, AGENTS.md
Added mandatory conventions for configurability (defaults first, overrides via inputs), three-layer feature-flag flow, step-section title formatting (# --- Title ---), reserved name restrictions (GITHUB_*, ACTIONS_*, RUNNER_* prefixes), runner enforcement (blacksmith-4vcpu-ubuntu-2404), and conditional outputs (has_<noun> pattern). Expanded guidance on uses: ./path resolution and composite action reference semantics.
Config & Tool Setup
.github/actionlint.yaml, .github/dependabot.yml, .github/labels.yml, .github/markdown-link-check-config.json, .yamllint.yml
Configured actionlint with blacksmith runner label, reorganized dependabot groups (new linting group with yamllint/actionlint/typos/markdown-link-check), added notify and lint labels, created markdown-link-check config with GitHub URL ignores and retry settings, added yamllint config (truthy: true/false only, line-length: 200, indentation: 2 spaces).
Removed Workflow
.github/workflows/changed-paths.yml
Deleted legacy reusable workflow that detected changed paths via git diff and matrix filtering. Replaced by shared composite src/config/changed-paths.
Workflow Runner & Version Updates
.github/workflows/branch-cleanup.yml, .github/workflows/dispatch-helm.yml, .github/workflows/helm-update-chart.yml, .github/workflows/labels-sync.yml
Updated runners from ubuntu-latestblacksmith-4vcpu-ubuntu-2404, bumped action versions (checkout v4→v6, setup-go v5→v6, create-github-app-token v1→v2, ghaction-import-gpg v6→v7). Switched local composite references to remote shared workflows (e.g., ./src/config/branch-cleanupLerianStudio/.../branch-cleanup@develop).
Workflow Action Version Bumps
.github/workflows/frontend-pr-analysis.yml, .github/workflows/go-ci.yml, .github/workflows/go-release.yml, .github/workflows/go-security.yml, .github/workflows/typescript-ci.yml, .github/workflows/api-dog-e2e-tests.yml
Updated GitHub Actions versions: setup-node v4→v6, upload-artifact v4/v6→v7, download-artifact v7→v8, github-script v7→v8, goreleaser v6→v7, docker actions v3→v4, Trivy v0.34.1→v0.35.0, markdown-link-check gaurav-nelsontcort action. No logic changes.
Monorepo Changed-Paths Refactoring
.github/workflows/build.yml, .github/workflows/release.yml, .github/workflows/typescript-release.yml, .github/workflows/gptchangelog.yml
Replaced legacy changed-paths workflow calls with new shared composite LerianStudio/.../changed-paths@develop, renamed inputs (filter_paths/path_level/get_app_name → kebab-case equivalents). Added shared-paths input for triggering all-component builds on matched patterns. Added has_builds output with if: needs.prepare.outputs.has_builds == 'true' gating. Minor shell quoting fixes (>> "$GITHUB_OUTPUT").
Complex Workflow Enhancements
.github/workflows/build.yml, .github/workflows/go-pr-analysis.yml, .github/workflows/pr-security-scan.yml
build.yml: Added force_multiplatform input, QEMU conditional on arm64, SBOM/provenance settings, action version bumps. go-pr-analysis.yml: Added enable_integration_tests, integration_test_command, enable_test_determinism, test_determinism_runs inputs with matrix jobs, updated action versions. pr-security-scan.yml: Added shared_paths, app_name_prefix, app_name_overrides, enable_health_score inputs; replaced inlined Trivy/reporting logic with shared composites (changed-paths, trivy-fs-scan, trivy-image-scan, dockerfile-checks, pr-security-reporter); centralized Docker registry step updates (v3→v4, v6→v7).
New Workflows: Specialized Tasks
.github/workflows/go-fuzz.yml, .github/workflows/release-notification.yml
go-fuzz.yml: Reusable workflow for Go fuzz testing with configurable command, artifacts, timeout, dry-run. release-notification.yml: Routes release notifications to Discord/Slack via shared workflows, resolves tag via event or GitHub CLI fallback, supports dry-run preview.
New Workflows: Build & Validation
.github/workflows/typescript-build.yml, .github/workflows/self-pr-validation.yml
typescript-build.yml: Reusable build workflow for TypeScript components, compute matrix from changed paths, Docker build/push via docker-build-ts composite, optional GitOps artifacts and Helm dispatch. self-pr-validation.yml: PR validation triggering lint jobs (yamllint, actionlint, shellcheck, typos, markdown, readme, composite-schema) based on changed file detection, aggregated PR comment via lint-reporter.
Composite Actions: Change & Workflow Detection
src/config/changed-paths/action.yml, src/config/changed-paths/README.md, src/config/changed-workflows/action.yml, src/config/changed-workflows/README.md
changed-paths: New composite replacing removed workflow; detects changed files via event-aware git diff, applies filter/shared-paths logic, outputs matrix/has_changes. Complex monorepo modes: single-app fallback, type2 consolidation, name prefixing. changed-workflows: Detects changed .yml, .github/workflows/*.yml, action/composite files, markdown via PR diff or full-repo scan; outputs space/comma-separated lists.
Composite Actions: Linting
src/lint/*/action.yml, src/lint/*/README.md (yamllint, actionlint, shellcheck, typos, markdown-link-check, pinned-actions, readme-check, composite-schema)
Created 8 new linting composites with README documentation. yamllint/actionlint: Wrap upstream actions with file-list logging and conditional skip. shellcheck: Parse YAML for run: blocks, extract bash/sh, run shellcheck with expression placeholders, map issues to annotations. typos: Wrap crate-ci/typos with file filtering. markdown-link-check: Validate links via tcort action. pinned-actions: Scan uses: lines, enforce @vX.Y.Z/SHA pinning (warn on internal @main, fail external). readme-check: Ensure sibling README.md for each src/*/action.yml. composite-schema: Validate composite action YAML structure (name/description/steps limits, inputs non-empty desc, required/default consistency, kebab-case, reserved-prefix rejection).
Composite Actions: Security Scanning
src/security/*/action.yml, src/security/*/README.md (dockerfile-checks, trivy-fs-scan, trivy-image-scan, pr-security-reporter)
dockerfile-checks: Download CISA KEV catalog, parse Dockerfile for non-root USER. trivy-fs-scan: Run Trivy secret (SARIF + table) and vuln (JSON) scans. trivy-image-scan: Scan Docker image, optional license scan, output SARIF/JSON. pr-security-reporter: Parse artifact files, build markdown report, post/update PR comment with findings summary, annotation details (paginated), conditional failure gating. Complex multi-step integration with Checks API for annotation extraction.
Composite Actions: Notifications
src/notify/*/action.yml, src/notify/*/README.md (discord-release, slack-release, slack-notify, pr-lint-reporter)
discord-release: Wrap SethCohen/github-releases-to-discord, detect beta tag, conditional skip. slack-release: Wrap rtCamp/action-slack-notify with release formatting. slack-notify: Slack workflow status via webhook, map status→color/emoji, optional failed-jobs detail. pr-lint-reporter: Post/update aggregated PR comment with lint check results (status table, per-check file counts, failure annotations via Checks API).
Composite Actions: Build
src/build/docker-build-ts/action.yml, src/build/docker-build-ts/README.md, src/config/labels-sync/action.yml
docker-build-ts: Build/push TypeScript Docker images with multi-platform support (QEMU setup), registry login (DockerHub/GHCR), npmrc secret injection, metadata tag generation, dry-run support, output digest/tags. labels-sync: Updated checkout to v6 (no logic change).
Composite Actions: Step-Section Titles
src/config/branch-cleanup/action.yml
Added "Merged Branch Mode" and "Stale Branch Mode" section markers before respective conditional steps. Documentation-only annotation (no logic change).
Documentation: Workflow Features
docs/build-workflow.md, docs/changed-paths-workflow.md, docs/go-fuzz.md, docs/go-pr-analysis-workflow.md, docs/pr-security-scan-workflow.md, docs/release-notification.md, docs/typescript-build.md
Removed changed-paths-workflow.md (feature replaced). Added/updated: force_multiplatform input, new integration-tests/test-determinism jobs, new enable_docker_scout input, new release-notification workflow docs, new typescript-build docs including npmrc secret handling, docker-build-ts composite docs.
Composite READMEs
src/config/changed-paths/README.md, src/config/changed-workflows/README.md, src/lint/*/README.md, src/security/*/README.md, src/notify/*/README.md, src/build/docker-build-ts/README.md
Comprehensive documentation for all 20+ new composite actions, detailing inputs, outputs, artifacts, permissions, usage examples, special modes/edge cases.

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~120 minutes

Possibly related PRs

Suggested labels

workflow, dependencies, size/XL

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch develop

@lerian-studio lerian-studio added the size/XL PR changes ≥ 1000 lines — consider splitting label Mar 20, 2026
@lerian-studio
Copy link

This PR is very large (80 files, 7140 lines changed). Consider breaking it into smaller PRs for easier review.

@github-actions github-actions bot added documentation Improvements or additions to documentation workflow Changes to one or more reusable workflow files dependencies Dependency updates (usually opened by Dependabot) typescript Changes to TypeScript or Frontend workflows security Changes to security workflows or vulnerability reporting policy golang Changes to Go-related workflows and removed size/XL PR changes ≥ 1000 lines — consider splitting labels Mar 20, 2026
@lerian-studio
Copy link

🔍 Lint Analysis

Check Files Scanned Status
YAML Lint 46 file(s) ❌ failure
Action Lint 22 file(s) ❌ failure
Pinned Actions 43 file(s) ❌ failure
Markdown Link Check 30 file(s) ❌ failure
Spelling Check 80 file(s) ❌ failure
Shell Check 43 file(s) ❌ failure
README Check 43 file(s) ✅ success
Composite Schema 21 file(s) ✅ success
❌ Failures (6)

YAML Lint

.github

  • .github (line 98) — Process completed with exit code 255.

Action Lint

.github/workflows/dispatch-helm.yml

  • .github/workflows/dispatch-helm.yml (line 335) — shellcheck reported issue in this script: SC2086:info:11:50: Double quote to prevent globbing and word splitting
  • .github/workflows/dispatch-helm.yml (line 335) — shellcheck reported issue in this script: SC2086:info:10:50: Double quote to prevent globbing and word splitting
  • .github/workflows/dispatch-helm.yml (line 109) — shellcheck reported issue in this script: SC2086:info:171:46: Double quote to prevent globbing and word splitting

.github/workflows/api-dog-e2e-tests.yml

  • .github/workflows/api-dog-e2e-tests.yml (line 111) — shellcheck reported issue in this script: SC2046:warning:2:8: Quote this to prevent word splitting
  • .github/workflows/api-dog-e2e-tests.yml (line 83) — shellcheck reported issue in this script: SC2086:info:2:27: Double quote to prevent globbing and word splitting
  • .github/workflows/api-dog-e2e-tests.yml (line 83) — shellcheck reported issue in this script: SC2086:info:1:56: Double quote to prevent globbing and word splitting
  • .github/workflows/api-dog-e2e-tests.yml (line 64) — shellcheck reported issue in this script: SC2086:info:9:62: Double quote to prevent globbing and word splitting
  • .github/workflows/api-dog-e2e-tests.yml (line 64) — shellcheck reported issue in this script: SC2086:info:6:27: Double quote to prevent globbing and word splitting
  • .github/workflows/api-dog-e2e-tests.yml (line 64) — shellcheck reported issue in this script: SC2086:info:5:62: Double quote to prevent globbing and word splitting
  • .github/workflows/api-dog-e2e-tests.yml (line 64) — shellcheck reported issue in this script: SC2086:info:10:25: Double quote to prevent globbing and word splitting

Pinned Actions

src/security/trivy-image-scan/action.yml

  • src/security/trivy-image-scan/action.yml (line 74) — Unpinned action found: uses: aquasecurity/trivy-action@0.35.0
  • src/security/trivy-image-scan/action.yml (line 60) — Unpinned action found: uses: aquasecurity/trivy-action@0.35.0
  • src/security/trivy-image-scan/action.yml (line 49) — Unpinned action found: uses: aquasecurity/trivy-action@0.35.0

src/security/trivy-fs-scan/action.yml

  • src/security/trivy-fs-scan/action.yml (line 65) — Unpinned action found: uses: aquasecurity/trivy-action@0.35.0
  • src/security/trivy-fs-scan/action.yml (line 50) — Unpinned action found: uses: aquasecurity/trivy-action@0.35.0
  • src/security/trivy-fs-scan/action.yml (line 38) — Unpinned action found: uses: aquasecurity/trivy-action@0.35.0

.github/workflows/go-security.yml

  • .github/workflows/go-security.yml (line 195) — Unpinned action found: uses: trufflesecurity/trufflehog@main
  • .github/workflows/go-security.yml (line 168) — Unpinned action found: uses: aquasecurity/trivy-action@0.35.0
  • .github/workflows/go-security.yml (line 153) — Unpinned action found: uses: sonatype-nexus-community/nancy-github-action@main
  • .github/workflows/go-security.yml (line 102) — Unpinned action found: uses: securego/gosec@master

Markdown Link Check

No annotation details available — view full logs.

Spelling Check

.github

  • .github (line 163) — Process completed with exit code 64.

Shell Check

.github

  • .github (line 178) — Process completed with exit code 1.
  • .github (line 177) — Found 6 shellcheck error(s) in run: blocks.

🔍 View full scan logs

@bedatty bedatty merged commit f8da102 into main Mar 20, 2026
17 of 25 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Dependency updates (usually opened by Dependabot) documentation Improvements or additions to documentation golang Changes to Go-related workflows security Changes to security workflows or vulnerability reporting policy typescript Changes to TypeScript or Frontend workflows workflow Changes to one or more reusable workflow files

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants